package com.examination.utils;
import com.examination.bean.User;

import java.io.IOException;
import java.sql.*;
import java.util.*;

/**
 * 数据库相关配置
 */
public class DbUtil {
    //单例对象
    private static Connection conn;
    //获得一个单例对象
    public static Connection getConnInstance(){
        if(conn == null){
            conn = PropertiesUtil.getMysqlConn();
        }
        return  conn;
    }
    //可以重载多个，这里就懒得写了
    public static void close(ResultSet rs, Statement st, Connection conn){
        try {
            if (rs!=null) {
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (st!=null) {
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (conn!=null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public static void testDb() throws Exception {
        Connection conn = DbUtil.getConnInstance();
        //3.操作数据库，实现增删改查
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT  *  FROM e_user");
        //如果有数据，rs.next()返回true
        while(rs.next()){
            System.out.println(rs.getString("name")+" 年龄："+rs.getString("password"));
        }
        close(rs,stmt,conn);
    }
    /**
     *通过数据库结果集返回对象集合,轻量orm
     * @param clazz 对象类型
     * @param rs 数据库结果集
     * @return List<Object>封装的对象类型
     */
    public static <T> List<T> getObjectList(Class<T> clazz, ResultSet rs) throws Exception {
        List<T> objectList = null;
        //判断是否存在记录
        if (rs.next()) {
            //存在记录 rs就要向上移一条记录 因为rs.next会滚动一条记录了
            rs.previous();
            objectList = new ArrayList<>();
            //表原数据
            ResultSetMetaData rsmd = rs.getMetaData();
            String tableName = rs.getMetaData().getTableName(1);//就可以返回表名
            Map mapObj = null;
            int numberOfColumns = rsmd.getColumnCount(); //得到数据集的列数
            while (rs.next()) {
                T objTemp = clazz.newInstance();
                //准备将1行数据封装到JavaBean
                String columnName;//数据库字段名
                Object columnVal = null;//字段列值
                String columnTypeName;//字段数据类型
                for (int i = 1; i <= numberOfColumns; i++) {
                    columnName = rs.getMetaData().getColumnName(i);
                    columnTypeName =  rs.getMetaData().getColumnTypeName(i);
                    columnVal = rs.getObject(columnName);
                    ReflectionUtil.setObjectValue(objTemp,columnName,columnVal);
                }
                objectList.add(objTemp);
            }
        }
        return objectList;
    }

    /**
     * 返回Map类型的List集合
     * @param rs
     * @return
     * @throws Exception
     */
    public static List<Map> getObjectMapList(ResultSet rs) throws Exception {
        List<Map> objectList = null;
        //判断是否存在记录
        if (rs.next()) {
            //存在记录 rs就要向上移一条记录 因为rs.next会滚动一条记录了
            rs.previous();
            objectList = new ArrayList<Map>();
            //表原数据
            ResultSetMetaData rsmd = rs.getMetaData();
            String tableName = rs.getMetaData().getTableName(1);//就可以返回表名
            Map mapObj = null;
            int numberOfColumns = rsmd.getColumnCount(); //得到数据集的列数
            while (rs.next()) {
                Map objTemp = new HashMap();
                //准备将1行数据封装到JavaBean
                String columnName;//数据库字段名
                Object columnVal = null;//字段列值
                String columnTypeName;//字段数据类型
                for (int i = 1; i <= numberOfColumns; i++) {
                    columnName = rs.getMetaData().getColumnName(i);
                    columnTypeName =  rs.getMetaData().getColumnTypeName(i);
                    columnVal = rs.getObject(columnName);
                    objTemp.put(columnName,columnVal);
                }
                objectList.add(objTemp);
            }
        }
        return objectList;
    }
    public static void main(String[] args){
        try {
            testDb();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
